/*
 * TcpServer.h
 *
 *   Created on: 2010-1-23     
 *  Description: 基于TCP协议的json_rpc服务器
 *    Copyright: 2010 @ ICT Li Heyuan
 */

#ifndef TCPSERVER_H_
#define TCPSERVER_H_

#include "../net/Network.h"
#include "../conn/Conn.h"
#include "../conn/TcpConn.h"
#include "Server.h"

#include <map>
#include <string>

class TcpServer: public Server
{
public:
	/* 构造Tcp服务器，
	 * @param port 端口号
	 * @param backlog listen的时候后备队列长度，默认20
	 * @param ip地址 默认为any_addr即""
	 */
	TcpServer(unsigned int port, int backlog = 20, const std::string ip = "");

	/* 析构造函数，用于释放资源等
	 */
	virtual ~TcpServer();

	/* 完成bind,listen等一系列工作
	 * @return 成功返回true，失败返回false
	 */
	virtual bool init();

	/* 重要工作函数，开始工作，将阻塞
	 * 直到异常退出的话返回
	 */
	virtual void service();

	/* 创建一个与Server配合工作的Conn，可能是TcpConn,HttpConn，UdpConn等以构成不同的服务器
	 * @return 一个符合Server类型的Conn
	 */
	inline virtual Conn* newConn(int sock, const EasyAddr &addr);

	enum
	{
		EPOLL_IN, EPOLL_OUT
	};

	/* 处理epoll的in事件
	 * @param ev 发生的事件
	 * @param epoll epollfd
	 */
	bool event_in(struct epoll_event &ev, int epoll);

	/* 处理epoll的out事件
	 * @param ev 发生的事件
	 * @param epoll epollfd
	 */
	bool event_out(struct epoll_event &ev, int epoll);

	/* 当有Client请求的时候，向connMap中添加一个Conn
	 * @param sock 与client连接的sock
	 * @param addr client的地址信息
	 */
	void addConn(int sock, const EasyAddr &addr);

	/* 关闭某个sock并从epollfd中移出
	 * @return 无返回
	 */
	void removeConn(int sock);

protected:
	//服务器的fd
	int _listenFd;
	//服务器epoll的fd
	int _epollfd;

	//<fd,TcpServerConn>的映射
	typedef std::map<int, Conn *> ConnMap;
	typedef std::map<int, Conn *>::iterator ConnMapItr;
	ConnMap _connMap;

};

#endif /* TCPSERVER_H_ */
